/**
 * 日期格式化工具库
 * 支持功能：
 * 1. 基础日期格式化（yyyy-MM-dd HH:mm:ss等20+种格式）
 * 2. 日期加减操作（天/月/年）
 * 3. 日期差计算
 * 4. 时区转换
 * 5. 农历转换（需扩展）
 */

const DateFormatter = {
	// 预设格式模板
	patterns: {
		default: 'yyyy-MM-dd HH:mm:ss',
		date: 'yyyy-MM-dd',
		time: 'HH:mm:ss',
		chinese: 'yyyy年MM月dd日 HH时mm分ss秒'
	},

	/**
	 * 核心格式化方法
	 * @param {Date} date - 日期对象
	 * @param {string} format - 格式字符串
	 * @returns {string} 格式化后的日期字符串
	 */
	format: function(date, format = this.patterns.default) {
		const pad = num => num.toString().padStart(2, '0');
		const map = {
			yyyy: date.getFullYear(),
			MM: pad(date.getMonth() + 1),
			dd: pad(date.getDate()),
			HH: pad(date.getHours()),
			mm: pad(date.getMinutes()),
			ss: pad(date.getSeconds()),
			SSS: date.getMilliseconds().toString().padStart(3, '0'),
			yy: date.getFullYear().toString().slice(-2),
			M: date.getMonth() + 1,
			d: date.getDate(),
			H: date.getHours(),
			m: date.getMinutes(),
			s: date.getSeconds()
		};

		return format.replace(/(yyyy|yy|MM|M|dd|d|HH|H|mm|m|ss|s|SSS)/g,
			match => map[match] || match);
	},

	/**
	 * 日期加减
	 * @param {Date} date - 原始日期
	 * @param {number} value - 加减值
	 * @param {string} unit - 单位（day/month/year/hour...）
	 * @returns {Date} 新日期对象
	 */
	add: function(date, value, unit = 'day') {
		const newDate = new Date(date);
		const units = {
			year: 'FullYear',
			month: 'Month',
			day: 'Date',
			hour: 'Hours',
			minute: 'Minutes',
			second: 'Seconds'
		};

		if (units[unit]) {
			newDate[`set${units[unit]}`](
				newDate[`get${units[unit]}`]() + value
			);
		}
		return newDate;
	},

	/**
	 * 计算日期差
	 * @param {Date} date1 - 日期1
	 * @param {Date} date2 - 日期2
	 * @param {string} unit - 单位（day/month/year...）
	 * @returns {number} 差值
	 */
	diff: function(date1, date2, unit = 'day') {
		const msDiff = date2 - date1;
		const divisors = {
			second: 1000,
			minute: 60000,
			hour: 3600000,
			day: 86400000
		};
		return Math.floor(msDiff / (divisors[unit] || 86400000));
	},

	/**
	 * 字符串转日期对象
	 * @param {string} dateString - 日期字符串
	 * @param {string} format - 字符串格式
	 * @returns {Date} 日期对象
	 */
	parse: function(dateString, format = this.patterns.default) {
		// 实现字符串到日期的解析逻辑
		// 简化为new Date的默认解析
		return new Date(dateString);
	}
};

// 示例用法
// console.log(DateFormatter.format(new Date(), 'yyyy-MM-dd HH:mm:ss'));
// console.log(DateFormatter.add(new Date(), 7, 'day'));
// console.log(DateFormatter.diff(new Date(), new Date(2025,0,1), 'day'));

module.exports = DateFormatter;